#ifndef GSMCONTROL_H
#define GSMCONTROL_H

#include <QObject>
#include <QTimer>

#include "tools/codeconvertor.h"
#include "tools/constant.h"
#include "model/message.h"
#include "model/pdu.h"
#include "database/database.h"



/**
 * @brief The GSMcontrol class
 * GSM控制类
 * 使用AT指令发送短信
 *
 */

class GSMcontrol : public QObject
{
    Q_OBJECT
public:
    explicit GSMcontrol(QObject *parent = 0);
    ~GSMcontrol();
    /**
     * @brief toPDU 将短信转换成PDU编码
     * @param me 短信
     * @return  PDU对象
     */
    static PDU toPDU(const Message &me);
    void restart();
signals:

    /**
     * @brief sig_error 错误，关闭猫
     */
    void sig_error();
    void sig_realTimeInfo(const QString &info);
    /**
     * @brief sig_CMGF 检测AT+CMGF=0是否成功
     */
    void sig_CMGF();//诱发事件
    /**
     * @brief sig_CMGS 检测AT+CMGS=len是否成功
     * @param len 中心地址信息长度
     */
    void sig_CMGS(int len);//诱发事件,信息长度
    /**
     * @brief sig_wirtePDU 发送PDU编码的内容
     * @param value 内容
     */
    void sig_wirtePDU(const QByteArray &value);//写入需要发送的PDU编码

    void sig_cnmi();
public slots:
    /**
     * @brief slt_getMessage 接受外部的信息对象
     * @param me 信息对象
     */
    void slt_getMessage(const Message &me);//接受条需要发送的短信，将其转码后写入串口
    /**
     * @brief slt_SendMessage 接受mode发过来的反馈
     * @param flag 标识
     */
    void slt_SendMessage(int flag);


private slots:

    void slt_timeOut();
    void slt_error();
    void slt_timeOut_1();
private:
    //volatile uint isSending;
    bool isActive;
    /**
     * @brief m_errorCount 实现串口的错误检测，不能进入发送的死循环
     */
    uint m_errorCount_CMGF;
    /**
     * @brief m_errorCount_CMGS
     */
    uint m_errorCount_CMGS;
    /**
     * @brief m_errorCount_Send
     */
    uint m_errorCount_Send;
    /**
     * @brief m_timer 对缓冲队列的定时查看定时器
     */
    QTimer m_timer;

    QTimer m_timer_1;//接受gsm短信

    QList<Message> m_queue;//缓存队列
    /**
     * @brief m_currentPDU 当前发送的PDU对象
     */
    PDU m_currentPDU;//当前的PDU编码;

    //保存短信的记录号
    QByteArray buffer;







};

#endif // GSMCONTROL_H
